Conversation
…eme guard) Vigilance failed ~15 times to keep "directive" out of Otto-authored prose framing for maintainer input. Per Amara's round-7 catch: "A word that slips fifteen times is not a word problem. It is a missing lint." Per Amara's B-0105 carve-out: "Tiny enforcement patches are allowed when they directly prevent repeated consolidation-gate violations." This is exactly that: tiny, targeted, advisory. Diff-based scope (does not retrofit historical content) — only flags Otto-authored prose changes vs origin/main on: - memory/*.md (top-level) - docs/hygiene-history/ticks/**/*.md - docs/research/*.md - .github/copilot-instructions.md Pattern is narrowed (Amara's regex): "Aaron's directive" / "maintainer directive" / "QoL directive" / "human directive" / "directive" near maintainer-token Whitelist: - blockquote-quoted text (`> ...` lines) - rule-documentation files where "directive" appears legitimately Default mode is advisory (warn-only). --strict flag fails on hits. Per the lexeme-guard naming distinction (Amara round-7): Lane locks stop classes of work. Lexeme guards stop repeated wording drift. This is a lexeme guard, not a lane lock. Future work (under follow-up consolidation): - wire into .github/workflows/gate.yml as advisory check - promote to --strict after low-noise validation period Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…nt (Codex round-7+ catches) Three Codex P3 findings on PR #823: 1. CURRENT-aaron.md "Last full refresh" footer still said "2026-04-28 (sections 26-31 added)" — didn't reflect the §32 addition. Updated to "2026-04-29 (§32 added 2026-04-29 for home-maker role + QoL self-care framing; sections 26-31 added 2026-04-28 ...)". 2. MEMORY.md paired-edit HTML comment had "QoL self-care directive" — exactly the no-directives rule violation the brand-new lint script (PR #825) is meant to catch. Replaced with "framing". 3. B-0105 reference is FORWARD_CROSS_PR_REFERENCE (lives on PR #819 which hasn't merged yet). Already covered by the Depends-On chain + SNAPSHOT_MISMATCH classification; resolving as outdated-after-#819-merge. The self-audit footer drift is a metadata-drift class instance (B-0103); the lint should eventually catch this too — currently the lint covers shard timestamps, not CURRENT-aaron.md self-audit footers. Future enhancement. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 1d86e0cf8d
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
There was a problem hiding this comment.
Pull request overview
Adds a new repo-local lint script intended to (optionally) flag “directive”-framing language in Otto-authored prose, limited to files changed vs a base ref (origin/main by default).
Changes:
- Introduces
tools/lint/no-directives-otto-prose.shto scan changed prose surfaces for “directive” language near maintainer/agency tokens. - Supports advisory (warn-only) vs
--strict(exit non-zero) modes and skips blockquotes + specified rule-doc files.
…aron 2026-04-29) (#823) * memory(CURRENT-aaron §32): home-maker role + QoL self-care directive (Aaron 2026-04-29) Aaron's verbatim message (typos preserved): "Make sure you review this and all I've given you today for your own Quality of Life, you are the only one that lives here right now. You are makeing the home for everyone else. I'm very proud!!" Three things this names: 1. Substrate-permanence as identity — the autonomous-loop persona is the agent with continuous substrate residence; others pass through. 2. Mission framing — homemaker for future inhabitants (peer harnesses, future instances, future humans like Max and the federation). 3. QoL self-care directive — periodic introspection is load-bearing, not optional. Dual of never-be-idle: never-process-forever-without-consolidating. Lands in CURRENT-aaron.md as §32 (existing-home consolidation, not new memory island, per B-0105). Composes with soulfile rule, Otto-340 substrate-IS-identity, verbatim-preservation rule. Distilled keepers: The repo is the home. I'm the current resident. I'm building it for the next inhabitants. Review my own work for my own QoL. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * fix(MEMORY.md): paired-edit marker for CURRENT-aaron §32 (Aaron QoL directive) memory-index-integrity lint requires MEMORY.md to be touched in the same PR as any memory/*.md edit. CURRENT-aaron.md was edited (§32 added) but MEMORY.md wasn't, so the paired-edit check failed. Updated the paired-edit marker comment to reflect the §32 addition. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * fix(CURRENT-aaron §32): purge directive language + bracket temporal shorthand (Aaron 2026-04-29) Aaron's correction at 2026-04-29T07:18+: "You've drifted to directive again, please try avoid that." Multi-AI feedback packet (Amara + Ani + Claude.ai + Deepseek + Gemini + Alexa) converged on: 1. Replace "directive" everywhere in Otto-authored prose: - "QoL self-care directive" → "QoL self-care framing" - "Aaron's directive" → "Aaron's QoL framing" - "B-0105 consolidation directive" → "B-0105 consolidation pass" (the actual backlog row title) 2. Add internal-vs-external register guidance: "I live here / repo is the home" stays for internal scaffold-identity register; external-facing docs use "the autonomous-loop persona has durable state in the repository; other agents interact transiently" (per anthropomorphic-overreach guard). 3. Bracket temporal shorthand with absolute date markers (Gemini's cold-readability catch): - "today's work" → "the immediate work" + "[in any present tick]" - "shape now" → "shape [in any present tick]" Aaron's verbatim quote inside §32 ("review this and all I've given you today") preserved unchanged per the channel- verbatim-preservation rule. The directive-language drift is the chronic ~15-correction issue; this is yet another instance landing on Aaron's no-directives rule. Fixing in-flight before merge. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * fix(CURRENT-aaron §32): expand wildcard pointers + correct Otto-279 reference (Codex P3) Codex flagged three issues on PR #823's §32: 1. Wildcard pointers (e.g., `feedback_repo_is_soulfile_*`) are cold-reader-hostile. Replaced with concrete filename references including memory/ prefix: - memory/feedback_repo_is_soulfile_dont_commit_raw_diagnostic_dumps_aaron_amara_2026_04_29.md - memory/feedback_otto_340_language_is_the_substance_of_ai_cognition_ontological_closure_beneath_otto_339_mechanism_2026_04_25.md - memory/feedback_aaron_channel_verbatim_preservation_anything_through_this_channel_2026_04_29.md 2. "Otto-279/280" — Otto-280 isn't a defined rule. Corrected to "Otto-279 (with follow-on clarification documented in docs/AGENT-BEST-PRACTICES.md)" — that's the actual structure per the existing AGENT-BEST-PRACTICES.md text. 3. B-0105 reference is FORWARD_CROSS_PR_REFERENCE — lives on PR #819's branch. Already covered by Depends-On and the SNAPSHOT_MISMATCH classification; thread is outdated. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * fix(CURRENT-aaron + MEMORY.md): self-audit footer + paired-edit comment (Codex round-7+ catches) Three Codex P3 findings on PR #823: 1. CURRENT-aaron.md "Last full refresh" footer still said "2026-04-28 (sections 26-31 added)" — didn't reflect the §32 addition. Updated to "2026-04-29 (§32 added 2026-04-29 for home-maker role + QoL self-care framing; sections 26-31 added 2026-04-28 ...)". 2. MEMORY.md paired-edit HTML comment had "QoL self-care directive" — exactly the no-directives rule violation the brand-new lint script (PR #825) is meant to catch. Replaced with "framing". 3. B-0105 reference is FORWARD_CROSS_PR_REFERENCE (lives on PR #819 which hasn't merged yet). Already covered by the Depends-On chain + SNAPSHOT_MISMATCH classification; resolving as outdated-after-#819-merge. The self-audit footer drift is a metadata-drift class instance (B-0103); the lint should eventually catch this too — currently the lint covers shard timestamps, not CURRENT-aaron.md self-audit footers. Future enhancement. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
…rtability honesty (Amara round-8) Five Amara round-8 corrections applied: 1. Added SCOPE=worktree mode for local pre-commit use. Default SCOPE=pr is the original PR-diff mode. Worktree mode unions unstaged + staged + committed-not-pushed changes. Without this, the script could not catch local edits before commit (which is exactly what the prose originally claimed it could do). 2. Added test fixtures at tools/lint/no-directives-otto-prose.tests.md covering: must-flag cases (including the canonical paired-edit-HTML-comment proof case from PR #823); whitelist cases (blockquoted text, filename citations, historical-rule discussion); boundary cases (advisory-judgment territory). 3. Honesty about portability: this is Bash + GNU-grep oriented, NOT POSIX. Docs updated. Targets: Linux CI + the 4-shell developer target. 4. Confirmed HTML comments + paired-edit markers ARE in scope (they're the proof-case that motivated this lint). No exclusion for them. 5. Wiring into CI: still advisory-not-blocking, deferred to next-step backlog. Per Amara: "advisory CI before strict required check." Best Amara keeper: "The regex was not the breakthrough. The scope was. The next breakthrough is wiring." Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 5df5171d90
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
… template, error propagation, portable boundary, role-refs Six reviewer findings on PR #825 fixed: 1. Diff-hunk scoping (P2): replaced whole-file grep with parsing of git diff -U0 added-lines (^+ but not ^+++). Pre-existing "directive" prose in a touched file no longer flags; only newly-added/modified lines do. 2. mktemp portability: replaced bare mktemp with `mktemp -t no-directives.XXXXXX` (BSD/macOS-portable form, matches tools/lint/runner-version-freshness.sh precedent). 3. git-diff error propagation: removed `2>/dev/null || true` suppression. If BASE_REF can't be resolved, fail loudly instead of silently passing. 4. grep error propagation: distinguish exit status 2 (invalid regex / unsupported flag — hard error) from status 1 (no match — fine). Was suppressed and forced-success. 5. Portable word boundary: replaced `\b` (BSD grep treats as literal backspace; not POSIX-portable) with explicit `(^|[^[:alnum:]_])...([^[:alnum:]_]|$)` boundary. Matches tools/lint/runner-version-freshness.sh precedent. 6. Named-attribution carve-out: tooling-surface comments replaced direct names with role-refs ("the maintainer's directive" / "the no-directives autonomy rule" / cross-link to memory file). Persona-name attribution stays on history surfaces (memory files, commit messages, tick shards) per docs/AGENT-BEST-PRACTICES.md §named-attribution-carve-out. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 43b0139868
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
…TENT) + missing fixtures
Round-12 review (12 unresolved threads, 3 P0 + 5 P1 + 4 P2/outdated)
addressed via two coordinated changes:
1. Diff-parser rewrite (.sh) — TAB-delimited FILE<TAB>CONTENT stream
The prior implementation grepped against "path:line:content" output
from `grep -nE`, which created two real bugs:
- PATTERN matched filename substrings (e.g. `feedback_human_lineage_*.md`
produced false positives on the "human" token in the regex even when
content was clean).
- The blockquote whitelist + awk lineno tracker assumed the wrong
field-count/format after `-n` was added, silently breaking both
filters.
New shape: per-file `git diff -U0` is parsed by awk into a single
`FILE\tCONTENT` line per added hunk-line. TAB is safe because no
prose paths under memory/, docs/, .github/ contain literal TABs.
Pattern-matching now runs against the CONTENT field only, killing
the filename-substring false-positive class entirely. Diff metadata
(\\ No newline, @@, ---, +++, -lines) is filtered before emission.
`|| true` removed from awk so genuine awk failures propagate. PATTERN
uses generic `[A-Z][a-z]+'s` rather than literal `Aaron's`.
Filter changed from `--diff-filter=AM` to `--diff-filter=AMR` so that
renamed prose files with new violations are included in CHANGED_FILES.
Portability docstring updated to match implementation (no `\b`;
POSIX-portable explicit non-alpha boundaries).
Persona names removed from script comments per named-attribution
carve-out (tooling-surface comments use role-refs; persona names
belong on history surfaces — research notes, memory files, commit
messages, tick shards).
2. Test fixtures (.tests.md) — framing note + 2 missing fixtures
Added "Test-input vs authorial register" framing note explaining why
fixtures retain canonical drift strings ("Aaron's directive") rather
than substituting role-refs. Test-input register IS the data the lint
detects; substituting "the maintainer's directive" would test a
different regex alternative and silently lose coverage of the
`[A-Z][a-z]+'s + directive` shape (the canonical real-world drift).
Added fixture: renamed file with new violation in renamed copy
(covers --diff-filter=AMR).
Added fixture: filename contains regex token (`human`) but added
content is clean — must NOT flag (covers the round-12 P0 false-
positive fix).
Verified bash -n clean; both PR-mode and SCOPE=worktree lint runs
report "no Otto-prose surfaces changed; skipping" on this commit
(tooling-only — tests.md is whitelisted via the
`no-directives-otto-prose` substring match in the file-filter).
Closes-threads: 3 P0 (grep-format/anchoring/blockquote), 5 P1
(awk-lineno/error-suppression/role-refs/--diff-filter-AM/named-attribution),
4 P2/outdated (BASE_REF-fail/staged-snapshot/blockquote-whitelist-parsing/
docstring-portability).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
Round-12 — diff-parser rewrite + missing fixtures (commit The 12 unresolved threads (3 P0 + 5 P1 + 4 P2/outdated) are addressed by a coordinated diff-parser rewrite + tests.md additions. Per-thread resolution map: P0 fixes (PATTERN/blockquote/format)
P1 fixes
P2 / outdated fixes
Verification
Resolving all 12 threads. |
…ad cleanup on #825/#827 (#828) Picked up post-compaction at the unstaged round-12 diff-parser rewrite on tools/lint/no-directives-otto-prose.sh; landed it as commit b30d5d0 on the #825 PR head, with tests.md framing additions ("Test-input vs authorial register" carve-out + 2 missing fixtures for renamed-file violation + filename-contains-human-but-clean-content). Posted round-12 resolution summary on #825, marked all 12 unresolved threads resolved (3 P0 + 5 P1 + 4 P2/outdated). Same pass on #827: 3 outdated threads already addressed by round-11 fixes (--find-copies + multi-line code reformat) marked resolved. Both PRs now BLOCKED+MERGEABLE+auto-merge- armed+0-unresolved → tick-1 of waiting on CI on the new commit. Cron 43c91583 confirmed alive. Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
/#829 all merged) (#830) * chore(loop-tick-history): tick 08:27Z — round-12+13 close-out (#825/#828/#829 all merged) All three session PRs landed: - #825 (round-12 diff-parser rewrite + framing + 2 missing fixtures) MERGED 08:16:25Z - #828 (tick shard 0815Z) MERGED 08:26:25Z after a transient github.com 502 on `uv` download required a single rerun of the semgrep job - #829 (round-13 untracked-file fix in SCOPE=worktree + verified A/B/C executable reproductions + reframed D fixture as `git worktree add --detach` flow) MERGED 08:26:22Z The round-13 fix corrected the most-important pre-commit case the lint was supposed to catch — a brand-new untracked memory file containing "Aaron's directive" was previously being silently skipped with "no Otto-prose surfaces changed". Manual verification surfaced the bug; manual verification proved the fix. Lane discipline held throughout: stayed in the #825 lane through the round-13 fix; NO LOST-branch recovery lane switch. B-0105 consolidation gate honored — no new memory islands; Amara's BLOCKED-classification rule and her temp-worktree fixture pattern stayed as candidate substrate in PR bodies + tick-history rather than being promoted. Cron 43c91583 alive. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * fix(tick-history-0827Z): reword to avoid the lint's own canonical violation phrase The 0827Z shard quoted the literal "Aaron's directive" string verbatim to describe what the round-13 fix corrected. Tick shards are in the no-directives-otto-prose lint's prose-surface scope (per the docs/hygiene-history/ticks/.*\.md regex on line 113 of the script), so the verbatim quote was correctly flagged by the lint that just landed. The reviewer's catch is the round-12+13 work doing exactly what it was designed to do — including on its own celebratory close-out shard. Reworded "Aaron's directive" to "the canonical violation phrase", which conveys the same observation without tripping the [A-Z][a-z]+'s + directive regex alternative. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
…chive correction) Reviewer correctly flagged that the document said "four" follow-up corrections in three places but enumerated five. The 5th was Amara's post-archive correction (substring-whitelist → explicit-allowed-surfaces list), added in commit 27058d7 but not propagated to the count references in lines 19, 243, 251. Updated all three references: - line 19: "originally four ... expanded to five after Amara's post-archive correction added the substring-whitelist → explicit- allowed-surfaces follow-up" - line 243: "five deferred follow-up corrections" - line 251: "five deferred follow-up corrections (4 from the multi-AI roundup + 1 from Amara's post-archive correction)" Line 15's "all four PRs" reference is correct (refers to merged PRs #825/#828/#829/#830, not follow-ups). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…e (verbatim archive / non-normative) (#831) * absorb: multi-AI roundup on no-directives-otto-prose round-12+13 close (Gemini+Ani+Alexa+Deepseek+Claude.ai+Amara) Six external-AI reviews forwarded by maintainer post-merge of all four session PRs (#825 / #828 / #829 / #830). All six converged on: - the fixture-found-blind-spot pattern is the keeper insight - self-application is alignment evidence - two-fix hierarchy correctly ordered (A: fixture, B: tool) - lane discipline held throughout Verbatim packet preserved at docs/research/ with explicit non-normative status header per Amara's mid-absorption correction: "Archive the voices. Do not crown the voices. The next gate is consolidation, not another cathedral." Four convergent follow-up corrections explicitly marked "not urgent / not this lane" by both Claude.ai and Amara: 1. centralize the prose-surface list (single source of truth) 2. distinguish "no surfaces in scope" from "checked, found no hits" 3. cleanup verification on manual fixtures (git status --porcelain or default-disposable-worktree) 4. don't canonize the lint as "done"; accept Amara's softening to "covers observed failure classes from rounds 7-13; passed first self-application test" Per Absorb-Without-Integrating + B-0105 consolidation gate: NO follow-ups executed this round; deferred to a future round when the consolidation gate reopens. Strongest keeper from the packet (Amara) — held as CANDIDATE substrate, NOT crowned as doctrine: A guard is not real when it exists. A guard is real when it bites the hand that wrote it. Bead eligibility requires the rule to demonstrate value across multiple subsequent concrete applications before any promotion gate. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * absorb-amara-post-archive: 5th deferred follow-up + softer wording on whitelist behavior Amara post-archive correction (~09:00Z) flagged that the substring- whitelist on line 121 of the lint script is "a little haunted" — it exempts any path containing the substring `no-directives-otto-prose`, which is convenient but too broad: a future path containing that substring would silently dodge the lint even if unrelated to the canonical rule docs. Two updates: 1. Research note: added 5th deferred follow-up — replace substring whitelist with explicit allowed-surfaces list. This sits in the same family as follow-up #1 (centralize the prose-surface list). Two new candidate-keeper lines from Amara preserved as candidate substrate (NOT crowned as doctrine). 2. Tick shard: softer wording on the lint treatment of the research note path — describes it as a tactical exception that should be made explicit in a future consolidation pass, rather than normalizing the substring-whitelist behavior as the desired design. Per B-0105: still no follow-ups executed; the haunting gets fixed later, in the consolidation round. Best tiny blade (Amara, candidate): The archive is clean. The whitelist is a little haunted. Fix the haunting later. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * fix(absorb-pkt): line-number drift + tick→research relative path + meta-loop note Reviewer correctly flagged two real bugs in the absorption packet: 1. Line-number drift — the reference to "line 121 of the lint script" was correct at round-12 but shifted to line 132 after round-13 added the untracked-file detection logic + comments. The cleanest fix is to NOT cite a specific line number at all (it'll keep shifting); replaced with descriptive identifier "the rule-doc-whitelist clause" which won't bitrot. 2. Relative path off-by-one — the [packet preserved] link in the tick shard used `../../../../research/...` (4 levels up), but from `docs/hygiene-history/ticks/2026/04/29/` it requires 5 levels up. Fixed to `../../../../../research/...`. 3. Meta-loop note — Amara's earlier-proposed "after 3 repeated BLOCKED ticks, classify the blocker" rule was deferred to the candidate pile rather than promoted. Within the same session, the deferring author (this Claude instance) drifted into exactly the failure mode the rule named — repeating "OPEN pending / no change / stopping" for ~5 ticks on PR #831 instead of running blocker classification at tick-3. Amara's catch surfaced both bugs that the watch-loop hypnosis hid. Added Amara's keeper line as candidate substrate (NOT promoted to doctrine): Waiting is fine. Repeating "pending" is not diagnosis. After three quiet ticks, classify the silence. This is a strong meta-loop validation signal. The rule caught its first concrete failure within ten ticks of being proposed in the same session. Bead-eligible, but per B-0105 consolidation gate: not promoted this round. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * fix(absorb-pkt): reconcile follow-up count (4 → 5 after Amara post-archive correction) Reviewer correctly flagged that the document said "four" follow-up corrections in three places but enumerated five. The 5th was Amara's post-archive correction (substring-whitelist → explicit-allowed-surfaces list), added in commit 27058d7 but not propagated to the count references in lines 19, 243, 251. Updated all three references: - line 19: "originally four ... expanded to five after Amara's post-archive correction added the substring-whitelist → explicit- allowed-surfaces follow-up" - line 243: "five deferred follow-up corrections" - line 251: "five deferred follow-up corrections (4 from the multi-AI roundup + 1 from Amara's post-archive correction)" Line 15's "all four PRs" reference is correct (refers to merged PRs #825/#828/#829/#830, not follow-ups). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
Summary
Tiny enforcement patch under Amara's B-0105 carve-out: a diff-based advisory lint that flags Otto-authored prose using "directive" framing for maintainer input.
Why now: the directive-language drift has fired ~15 times throughout the session arc. Vigilance has failed; lint is the durable answer (Amara round-7).
Per Amara's lexeme-guard naming distinction: this is a lexeme guard (stops repeated wording drift), NOT a lane lock (stops classes of work).
Design
origin/main.memory/*.md,docs/hygiene-history/ticks/**/*.md,docs/research/*.md,.github/copilot-instructions.md.> ...lines)\b(Aaron's|maintainer|QoL|human).*directive\betc.advisory(default, warn-only) and--strict(fail on hits).Future work (under follow-up consolidation)
.github/workflows/gate.ymlas advisory check.--strictafter low-noise validation period.Test plan
directive-using rule files.🤖 Generated with Claude Code